package com.test.common.entity.perf;

import com.test.common.entity.perf.inner.ErrorMessageEntity;
import com.test.common.entity.perf.inner.TransactionMessageEntity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.*;
import java.util.Map.Entry;

@Data
@Document(collection = "t_perf_report_base")
public class PerfReportBaseEntity {

	@Id
	private String id;

	@Indexed
	private String reportId;

	@Indexed(direction = IndexDirection.DESCENDING)
	private long timeStampList;
	private List<TransactionMessageEntity> transactionMessageList = new ArrayList<>();
	private Map<String, ErrorMessageEntity> errorMessageMap = new HashMap<>();

	public PerfReportBaseEntity() {

	}

	public PerfReportBaseEntity(String reportId, long timeStampList) {
		this.id = UUID.randomUUID().toString();
		this.reportId = reportId;
		this.timeStampList = timeStampList;
	}

	public void merge(PerfReportBaseEntity perfReportBaseEntity) {

		// 时间戳取后面的
		this.timeStampList = perfReportBaseEntity.timeStampList;

		// 混合TransactionMessageEntity
		for (int i = 0; i < this.transactionMessageList.size(); i++) {
			TransactionMessageEntity transactionMessageEntity = this.transactionMessageList.get(i);
			for (int j = 0; j < perfReportBaseEntity.transactionMessageList.size(); j++) {
				TransactionMessageEntity transactionMessageEntityTmp = perfReportBaseEntity.transactionMessageList.get(j);
				if (transactionMessageEntity.getLabel().equals(transactionMessageEntityTmp.getLabel())) {
					transactionMessageEntity.setTimeStamp(transactionMessageEntityTmp.getTimeStamp());
					transactionMessageEntity.setSuccessCount(transactionMessageEntity.getSuccessCount() + transactionMessageEntityTmp.getSuccessCount());
					transactionMessageEntity.setFailCount(transactionMessageEntity.getFailCount() + transactionMessageEntityTmp.getFailCount());
					transactionMessageEntity.setQps((transactionMessageEntity.getQps() + transactionMessageEntityTmp.getQps()) / 2);
					transactionMessageEntity.setThreads(transactionMessageEntityTmp.getThreads());
					transactionMessageEntity.setAvgDealy((transactionMessageEntity.getAvgDealy() + transactionMessageEntityTmp.getAvgDealy()) / 2);
					transactionMessageEntity.setLevel_1_Dealy((transactionMessageEntity.getLevel_1_Dealy() + transactionMessageEntityTmp.getLevel_1_Dealy()) / 2);
					transactionMessageEntity.setLevel_2_Dealy((transactionMessageEntity.getLevel_2_Dealy() + transactionMessageEntityTmp.getLevel_2_Dealy()) / 2);
					transactionMessageEntity.setLevel_3_Dealy((transactionMessageEntity.getLevel_3_Dealy() + transactionMessageEntityTmp.getLevel_3_Dealy()) / 2);
					transactionMessageEntity.setMaxDealy(transactionMessageEntity.getMaxDealy() > transactionMessageEntityTmp.getMaxDealy() ? transactionMessageEntity.getMaxDealy() : transactionMessageEntityTmp.getMaxDealy());
					transactionMessageEntity.setMinDealy(transactionMessageEntity.getMinDealy() < transactionMessageEntityTmp.getMinDealy() ? transactionMessageEntity.getMinDealy() : transactionMessageEntityTmp.getMinDealy());
					transactionMessageEntity.setSendBytes((transactionMessageEntity.getSendBytes() + transactionMessageEntityTmp.getSendBytes()) / 2);
					transactionMessageEntity.setReceiveByte((transactionMessageEntity.getReceiveByte() + transactionMessageEntityTmp.getReceiveByte()) / 2);
					break;
				}
				if (j == perfReportBaseEntity.transactionMessageList.size()) {
					this.transactionMessageList.add(transactionMessageEntityTmp);
				}
			}
		}

		// 混合ErrorMessageEntity
		for (Entry<String, ErrorMessageEntity> entryTmp : perfReportBaseEntity.errorMessageMap.entrySet()) {
			this.errorMessageMap.merge(entryTmp.getKey(), entryTmp.getValue(), (old, now) -> {
				old.add(now);
				return old;
			});
		}
	}

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);

		for (int i = 0; i < list.size(); i++) {
			list.add(i * i);
			System.out.println(list);
		}
	}
}